package work.utils;

import com.h819.core.utils.MyDateUtils;

/**
 * @Title: StandardRegularUtils.java
 * @Description: TODO(标准号工具类，基础类，正则表达式)
 * @author H819
 * @date 2010-11-19
 * @version V1.0
 */
public class StandardContantUtils {

	// 常用变量
	static String blankSpace = " ";
//	static String letterT ="T";
//	static String letterZ ="Z";
//	static String letterQ ="Q";

	// === 应用正则表达式发现的问题 === //
	// 发现问题：(([1-9]+\\d*\\.\\d{1,3})|([1-9]+\\d*))
	// 这句话，([1-9]+\\d*\\.\\d{1,3}) 必须写在前面，"或"关系才可以起作用
	// 基本相同的表达式,复杂的验证关系要放在前面?

	// === 为了字符串合并的时候不产生歧义，每个子字符串都用括号()括起来 === //

	/**
	 * 标准号正则表达式部分
	 */
	// =======================
	// 按照 GB 1.1-2000 定义
	// ======================
	// 年号，必须以 19,20,21 开头，并且是四位
	static String yearReg = MyDateUtils.yearPatternReg;

	// 年月日，判断日期格式 yyyy-MM-dd
	static String dateReg = MyDateUtils.datePatternReg;

	// === 标准性质: "/T ",推荐性；"/Z ",指导性；" ", (空格)强制性
	static String type = "((/T )|(/Z )| )";

	// 地标性质: "/T ",推荐性；"/Z ",指导性；"/ ", 强制性
	static String typeForDB = "(((/T)|(/Z)|/) )";

	// === 主体标准号，小数点后只允许1到3位
	// 例如：
	// 123
	// 123.32
	static String standardCodeReg = "(\\d+(\\.\\d{1,3})?)";
	

	// === 国标或行标 标准号主体部分，只差标准类别
	// 例子 "/T 123.-2009"
	static String standardCodeYearReg = standardCodeReg + "-" + yearReg;


	/**
	 * 地方标准
	 * */
	// === 地方标准开始部分 DB+任意不小于0的两位数字
	static String preDBReg = "(DB[0-9]{2})";

	// === 完整的地方标准号
	static String dbFullStandardReg = preDBReg + typeForDB + standardCodeReg
			+ "-" + yearReg;

	/**
	 * 行业标准
	 * */
	// === 判断行业标准开始部分,任意二到四个字符的字符串
	// ===这是简单判断方法，如果要准确，需要到数据库查询行业标准代号
	static String preHBReg = "(^[A-Z]{2,4})";
	// === 行标 标准号
	// 例子 "NY/T 123.-2009","NY/Z 123.-2009","NY 123.-2009"
	static String mainHBStandardCodeReg = preHBReg + type + standardCodeReg
			+ "-" + yearReg;
	
	/**
	 * 国家标准
	 * */
	// === 国家标准类别
	static String preGBReg = "(^GB)";
	// === 国标 标准号
	// 例子 "GB/T 123.-2009","GB/Z 123.-2009","GB 123.-2009"
	static String mainGBStandardCodeReg = preGBReg + type + standardCodeReg
			+ "-" + yearReg;

	// ==============
	// 特殊情况处理 ==
	// ==============

	// 第一种： QJ , GJB
	// QJ(航天行业),GJB(国家军用标准) 类标准号,正常的标准号后面可以跟着A或者B
	// QJ 1492A-2005
	// GJB 标准有的这样标注:GJB 19B-2007 代替 GJB 19A-1998
	// 但是大多数还是还是和正常的标准号差不多,所以列在这里特殊处置
	// GJB 还有其他的特殊形式,比较乱,需要手工查看,这里就不做验证了.

	// 例如：
	// 123
	// 123A
	// 123.32B
	static String QJGJBstandardCodeReg = "((\\d+(\\.\\d{1,3})?)([AB]?))";
	static String mainQJGJBStandardCodeReg = "((QJ)|(GJB))" + type
			+ QJGJBstandardCodeReg + "-" + yearReg;

	// 第二种： NY 1500-2006,NY 1500.1-2006, NY 1500.1.1-2006
	// 此类标准最多允许三级分类
	static String NYstandardCodeReg = "(\\d+(\\.\\d{1,3}){0,2})";
	static String mainNYStandardCodeReg = "(NY)" + type + NYstandardCodeReg
			+ "-" + yearReg;

	/**
	 * 其他规则
	 * */

	// 页数，一位或多位正整数
	static String number = "(^[1-9]\\d+$)|(^[1-9]$)";
	// ICS
	static String ICS = "(^\\d{2}$)|(^\\d{2}[.-]\\d{3}$)|(^\\d{2}[.-]\\d{3}[.-]\\d{2}$)";
	// CCS
	static String CCS = "(^[A-Z]\\d{2}$)";

	// 平台中的数据(2009.07.01),需要定期从中更新
	// 环境保护(HJBZ)
	// 国家职业卫生标准(GBZ)
	// 电力行业热工自动化标准化技术委员会标准(DRZ)
	// 水利电力行业标准(SDZ)
	// 国家军用标准(GJBZ)
	// 俄罗斯国家标准(GOST)
	// 石油化工(SHT)
	// 中国认证人员与培训机构国家认可委员会(CNAT)
	// 国际电信联盟(ITU-T)
	// 以 Z 或 T 结尾的合理的类别，不用去掉 Z 或 T 再进一步判断
	static String rightClass[] = { "HJBZ", "GBZ", "DRZ", "SDZ", "GJBZ", "GOST",
			"SHT", "CNAT", "ITU-T" };

}
